/*
    Date:2022.03.22
    Author:胡鑫洋
    Target:数码管驱动
*/

#include<display.h>
#include<delay.h>

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
//sbit LATCH1 = P2^0;//定义锁存使能端口 段锁存
//sbit LATCH2 = P2^3;//                 位锁存
extern bit ReadADFlag;//extern声明，不是定义，外部变量
unsigned char code dofly_DuanMa[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量

/*
显示函数，动态扫描数码管，
参数FirstBit 表示需要显示的是第一位，比如0就是从第一个数码管显示，2就是从第三个数码管显示，
参数Num表示要显示的位数，也就是几个数码管显示，如要显示两位数，就应该输入2
*/
void Display(unsigned char FirstBit,unsigned char Num)
{
    static unsigned char i = 0;

    DataPort=0;   //清空数据，防止有交替重影
    LATCH1=1;     //段锁存
    LATCH1=0;

    DataPort=dofly_WeiMa[i+FirstBit]; //取位码 
    LATCH2=1;     //位锁存
    LATCH2=0;

    DataPort=TempData[i]; //取显示数据，段码
    LATCH1=1;     //段锁存
    LATCH1=0;

    i++;
    if(i==Num)
        i=0;
}

/*  定时器初始化  */
void Init_Timer0(void)
{
    TMOD |= 0x01;	  //使用模式1，16位定时器，使用"|"符号可以在使用多个定时器时不受影响
    EA=1;            //总中断打开
    ET0=1;           //定时器中断打开
    TR0=1;           //定时器开关打开
}

/*  定时器中断子程序    */
void Init_Timer0_isr(void) interrupt 1
{
    static unsigned int num;
    TH0=(65536-2000)/256;		  //重新赋值 高位 低位
    TL0=(65536-2000)%256;         //可以理解成，提前减去2000，就是2ms倒计时

    Display(0,8);       // 调用数码管扫描
    num++;
    if(num==50)        //中断50次，大致100ms
    {
        num = 0;
        ReadADFlag=1;//AD标志位1
    }
}